package transporte.server.dao.impl;

import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.stereotype.Repository;

import transporte.server.dao.UsuarioDao;
import transporte.server.entity.Usuario;

@Repository("usuarioDao")
public class UsuarioDaoImpl extends BaseDaoHibernate<Usuario> implements UsuarioDao {

	@Autowired
	public UsuarioDaoImpl(SessionFactory sessionFactory) {
		super(sessionFactory);
	}

	public void remove(long id) {
		// TODO Auto-generated method stub

	}

	public void save(Usuario t) {
		super.saveObject(t);

	}

	public Usuario getByLogin(String login) {
		try {
			return super.getObjectByParam("login", login);
		} catch (ObjectRetrievalFailureException e) {
			return null;
		}
    }

	@Override
    public void evict(Usuario o) {
	    super.evict(o);
    }
	
	public Usuario getBy(String login, Long nmidentificacion) {
		Criteria crit = getSessionFactory().getCurrentSession().createCriteria(Usuario.class);
		
		if (nmidentificacion != null) 
			crit.add(Restrictions.eq("nmidentificacion", nmidentificacion));
		
		if (StringUtils.isNotBlank(login)) 
			crit.add(Restrictions.eq("login", login));
		
		
		return (Usuario)crit.uniqueResult();
    }
	
	public void saveToBd(Usuario usuario){
		try {
			
			String sql = "insert into celis_usuarios(idpersona,login,password,fecha_modificacion,idperfil,idestado,fecha_creacion,fecha_correo) values(?, ?, ?, ?, ?, ?, ?, ?)";
            
			PreparedStatement pstmt = getSessionFactory().getCurrentSession().connection().prepareStatement(sql);
            
			pstmt.setLong(1, usuario.getIdPersona());
            pstmt.setString(2, usuario.getLogin());
            pstmt.setString(3, usuario.getPassword());
            pstmt.setTimestamp(4, usuario.getFechaModificacion());
            if (usuario.getPerfil() != null){
            	pstmt.setLong(5, usuario.getPerfil().getIdPerfil());
            }else{
            	pstmt.setNull(5, java.sql.Types.INTEGER);
            }
            
            pstmt.setLong(6, usuario.getEstado().getIdEstado());
            pstmt.setTimestamp(7, usuario.getFechaCreacion());
            pstmt.setNull(8, java.sql.Types.TIMESTAMP);
            
            pstmt.executeUpdate(); 
            pstmt.close(); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
		
	}

}
